iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
Modern Web

JavaScript學習日記系列 第 2

JavaScript學習日記 : Day2 - 動態型別+弱型別

  • 分享至 

  • xImage
  •  

1. 靜態型別 VS. 動態型別

1.1 靜態型別的例子

以Java為例:

int x

在宣告x變數時,使用了int這個關鍵字讓x的型別定在數字型別,而不能更改,如果企圖更改放入非整數的值 :

int x 
x = 'hi'

編譯時就會出現以下錯誤

HelloWorld.java:5: error: incompatible types: String cannot be converted to int

靜態型別的語言十分嚴謹,在語法撰寫時會相對麻煩(以JavaScript的角度看XD),但相對的可以減少很多因為型別所導致的Bug。

1.2 動態型別的例子

以JavaScript為例子:

let y = 100
y = '100'

在JavaScript中,在編寫的過程中可以任意變更變數的型別,在執行(Runtime)時並不會報錯。

1.3 靜態、動態型別總結

靜態語言(Statically Typed Languages)

  • 型態檢查(Type Checking)發生在編譯時期(Complile Time)
  • 必須明確使用型別宣告
  • 型別宣告後,在執行時無法進行轉換型別

動態語言(Dynamically Typed Languages)

  • 型別檢查(Type Checking)發生在執行階段(Runtime)
  • 不需使用明確的型別宣告
  • 執行時能隨意變更型別

2. 強型別 vs. 弱型別

2.1 強型別例子

一樣以Java為例:

int x = 100 + "100"
System.out.println(x)

出現編譯錯誤:

HelloWorld.java:4: error: incompatible types: String cannot be converted to int

Java並不會自動轉換型別去加總,如果是想要實現100+100的效果,可以使用以下方法:

int x = 100 + Integer.parseInt("100");
System.out.println(x); // 200

這就是所謂的強型別,不會隱性的轉換變數的型別。

2.2 弱型別的例子

一樣以JavaScript為例子:

let a = 123 + "456";

console.log(a) // 123456

成功執行,並且沒有錯誤訊息,只是JavaScript預設會把數字轉換為字串,如果目標是123+456的話可以使用以下方法:

let a = 123 + Number("456")

console.log(a) // 579

弱型別最常導致Bug的情況,除了混用不同型別去做數學運算或是字串的串接,另一個就是允許不同型別的比較:

  • == : 寬鬆比對,只比對兩值的內容
  • === : 嚴謹比對,比較兩值的型別與內容
let a = 123
let b = "123"
console.log(a==b,a===b) // true, false

2.3 強弱型別總結

  • 強型別(strongly typed) : 偏向不容許隱性型別轉換,型別檢查比較嚴格。
  • 弱型別(weakly typed) : 偏向允許隱性型別轉換,型別檢查比較寬鬆。

結論

以一張圖可以清楚知道常見的語言型別特性

(Source:動態語言、靜態語言、強型別和弱型別)

透過以上的介紹可以知道JavaScript是屬於動態弱型別語言,這樣的組合讓JavaScript在撰寫上相對鬆散與不安全,但是JavaScript終究是動態網頁不可缺少的角色,這也是為什麼TypeScript的出現,長期而言,在一些大型專案有助於開發與維護的穩定性。

參考資料:

動態語言與靜態?直譯與編譯?強型別與弱型別?
資料型態的夢魘


上一篇
JavaScript學習日記 : Day1 - 前言
下一篇
JavaScript學習日記 : Day3 - 基本型別(一)
系列文
JavaScript學習日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言